{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "2fb59980-27fb-4a18-8261-8ed024cc0501",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import patches\n",
    "from pathlib import Path\n",
    "import json\n",
    "import gzip\n",
    "import h5py\n",
    "import random\n",
    "from pol.utils.validation.scene_saver import load_scenes, count_h5_keys\n",
    "from pol.datasets.objdetect import COCODataset, collate_padding_fn\n",
    "from torch.utils.data import DataLoader, Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "84ef2c20-ab6c-49f0-97d5-4508a500cf14",
   "metadata": {},
   "outputs": [],
   "source": [
    "# scene_path = '../../tests/objdetect/scenes/full_spe/pol_res_mot/step-1000000.h5'\n",
    "scene_path = '../../tests/objdetect/scenes/full_spe/gol_res_mlr/step-1000000.h5'\n",
    "scenes = load_scenes(scene_path, unroll=False)\n",
    "eval_itr = 5000\n",
    "split = 'validation'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e31008d0-3bd1-41f4-aeb9-18a5f0560987",
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_img(ax, img, boxes=None, gt_boxes=None, lw=3.0):\n",
    "    #img = torch.permute(img, [1, 2, 0])\n",
    "    #ax.xaxis.tick_top()\n",
    "    ax.imshow(img)\n",
    "    \n",
    "    if boxes is not None:\n",
    "        for box in boxes:\n",
    "            x, y, w, h = box\n",
    "            x -= 0.5 * w\n",
    "            y -= 0.5 * h\n",
    "            x *= img.shape[1]\n",
    "            y *= img.shape[0]\n",
    "            w *= img.shape[1]\n",
    "            h *= img.shape[0]\n",
    "            ax.add_patch(patches.Rectangle((x, y), w, h, fill=False, edgecolor='orange', lw=lw))\n",
    "        \n",
    "    if gt_boxes is not None:\n",
    "        for box in gt_boxes:\n",
    "            x, y, w, h = box\n",
    "            x -= 0.5 * w\n",
    "            y -= 0.5 * h\n",
    "            x *= img.shape[1]\n",
    "            y *= img.shape[0]\n",
    "            w *= img.shape[1]\n",
    "            h *= img.shape[0]\n",
    "            ax.add_patch(patches.Rectangle((x, y), w, h, fill=False, edgecolor='green', lw=lw))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "05f86d79-921a-40bd-b8fe-3247f4e8961c",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "\"Unable to open object (object 'itr_5000' doesn't exist)\"",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_91389/4275959999.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     32\u001b[0m             \u001b[0mdraw_img\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mboxes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mboxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;31m#, gt_boxes=gt_boxes)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 34\u001b[0;31m \u001b[0mvis_grid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/tmp/ipykernel_91389/4275959999.py\u001b[0m in \u001b[0;36mvis_grid\u001b[0;34m()\u001b[0m\n\u001b[1;32m     29\u001b[0m             \u001b[0mimg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     30\u001b[0m             \u001b[0mgt_boxes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscenes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'gt'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'boxes'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 31\u001b[0;31m             \u001b[0mboxes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscenes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34mf'itr_{eval_itr}'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'boxes'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     32\u001b[0m             \u001b[0mdraw_img\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mboxes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mboxes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;31m#, gt_boxes=gt_boxes)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32m/mnt/lingxiao/anaconda3/envs/myenv/lib/python3.8/site-packages/h5py/_hl/group.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m    303\u001b[0m                 \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid HDF5 object reference\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    304\u001b[0m         \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 305\u001b[0;31m             \u001b[0moid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5o\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_e\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlapl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lapl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    306\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    307\u001b[0m             raise TypeError(\"Accessing a group is done with bytes or str, \"\n",
      "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mh5py/h5o.pyx\u001b[0m in \u001b[0;36mh5py.h5o.open\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mKeyError\u001b[0m: \"Unable to open object (object 'itr_5000' doesn't exist)\""
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABfAAAAKQCAYAAADQaVujAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABCjElEQVR4nO3db4gk9n3f8c83dxE0ThqZ6BJc/aFqkSOrxSr2RjUhbZWG1pLy4Aj4geRQUxEQAivkoUWhScFPmgcFYSz7OIw4/CR6EpMqRYkoLYkLjhqdwJZ1NjJXmVoXBSTFIQUbKs7+9cGO2+lqZ3dud787v1u9XrCwM/O7mS9z++bEd0czNcYIAAAAAAAwlx/b9AAAAAAAAMA7WeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh82qKqeqqo3qurlFbdXVX2mqi5X1UtV9aHjnhGuV/qCPvqCPvqCPvqCPvqCPhb4sFkXkty3x+33J7lj8fVIks8fw0xwUlyIvqDLhegLulyIvqDLhegLulyIvqCFBT5s0Bjjy0m+u8eRs0m+OLY9n+TGqnrf8UwH1zd9QR99QR99QR99QR99QR8LfJjbzUleW7p8ZXEdcHj6gj76gj76gj76gj76ggM6vekBgD3VLteNXQ9WPZLt/w0t73nPez585513ds4Fx+LFF198a4xxpunu9cW7mr6gj76gj76gj76gz2H6ssCHuV1JcuvS5VuSvL7bwTHG+STnk2Rra2tcvHixfzpoVlX/s/Hu9cW7mr6gj76gj76gj76gz2H68hY6MLdnknxi8WntH0nyN2OMv9z0UHBC6Av66Av66Av66Av66AsOyCvwYYOq6veS3Jvkpqq6kuR3kvx4kowxziV5NskDSS4n+X6ShzczKVx/9AV99AV99AV99AV99AV9LPBhg8YYD+1z+0jyyWMaB04UfUEffUEffUEffUEffUEfb6EDAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3zYsKq6r6peqarLVfX4Lrf/dFX9YVV9raouVdXDm5gTrkf6gj76gj76gj76gj76gh4W+LBBVXUqyZNJ7k9yV5KHququHcc+meQbY4y7k9yb5D9U1Q3HOihch/QFffQFffQFffQFffQFfSzwYbPuSXJ5jPHqGOPtJE8nObvjzEjyU1VVSX4yyXeTXD3eMeG6pC/ooy/ooy/ooy/ooy9oYoEPm3VzkteWLl9ZXLfss0k+kOT1JF9P8ltjjB8ez3hwXdMX9NEX9NEX9NEX9NEXNLHAh82qXa4bOy5/NMlXk/ydJP8oyWer6m+/446qHqmqi1V18c033zzqOeF6pC/ooy/ooy/ooy/ooy9oYoEPm3Ulya1Ll2/J9m+ilz2c5Etj2+Uk305y5847GmOcH2NsjTG2zpw50zYwXEf0BX30BX30BX30BX30BU0s8GGzXkhyR1XdvvjglgeTPLPjzHeS/EqSVNXPJfn5JK8e65RwfdIX9NEX9NEX9NEX9NEXNDm96QHg3WyMcbWqHkvyXJJTSZ4aY1yqqkcXt59L8ukkF6rq69n+X9I+NcZ4a2NDw3VCX9BHX9BHX9BHX9BHX9DHAh82bIzxbJJnd1x3bun715P8y+OeC04CfUEffUEffUEffUEffUEPb6EDAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3zYsKq6r6peqarLVfX4ijP3VtVXq+pSVf3pcc8I1yt9QR99QR99QR99QR99QY/Tmx4A3s2q6lSSJ5P8iyRXkrxQVc+MMb6xdObGJJ9Lct8Y4ztV9bMbGRauM/qCPvqCPvqCPvqCPvqCPl6BD5t1T5LLY4xXxxhvJ3k6ydkdZz6e5EtjjO8kyRjjjWOeEa5X+oI++oI++oI++oI++oImFviwWTcneW3p8pXFdcven+S9VfUnVfViVX1itzuqqkeq6mJVXXzzzTebxoXrir6gj76gj76gj76gj76giQU+bFbtct3Ycfl0kg8n+dUkH03yb6vq/e/4Q2OcH2NsjTG2zpw5c/STwvVHX9BHX9BHX9BHX9BHX9DEe+DDZl1JcuvS5VuSvL7LmbfGGN9L8r2q+nKSu5N863hGhOuWvqCPvqCPvqCPvqCPvqCJV+DDZr2Q5I6qur2qbkjyYJJndpz5j0n+SVWdrqqfSPKPk3zzmOeE65G+oI++oI++oI++oI++oIlX4MMGjTGuVtVjSZ5LcirJU2OMS1X16OL2c2OMb1bVHyd5KckPk3xhjPHy5qaG64O+oI++oI++oI++oI++oE+NsfPtqIDr3dbW1rh48eKmx4BDq6oXxxhbm55jmb44KfQFffQFffQFffQFfQ7Tl7fQAQAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+bFhV3VdVr1TV5ap6fI9zv1BVP6iqjx3nfHA90xf00Rf00Rf00Rf00Rf0sMCHDaqqU0meTHJ/kruSPFRVd60497tJnjveCeH6pS/ooy/ooy/ooy/ooy/oY4EPm3VPkstjjFfHGG8neTrJ2V3O/WaS30/yxnEOB9c5fUEffUEffUEffUEffUETC3zYrJuTvLZ0+criuv+rqm5O8mtJzu11R1X1SFVdrKqLb7755pEPCtchfUEffUEffUEffUEffUETC3zYrNrlurHj8hNJPjXG+MFedzTGOD/G2BpjbJ05c+ao5oPrmb6gj76gj76gj76gj76gyelNDwDvcleS3Lp0+ZYkr+84s5Xk6apKkpuSPFBVV8cYf3AsE8L1S1/QR1/QR1/QR1/QR1/QxAIfNuuFJHdU1e1J/iLJg0k+vnxgjHH7j76vqgtJ/pN/3GAt+oI++oI++oI++oI++oImFviwQWOMq1X1WLY/ff1UkqfGGJeq6tHF7Xu+Lxywmr6gj76gj76gj76gj76gjwU+bNgY49kkz+64btd/2MYY//o4ZoKTQl/QR1/QR1/QR1/QR1/Qw4fYAgAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+bFhV3VdVr1TV5ap6fJfbf72qXlp8faWq7t7EnHA90hf00Rf00Rf00Rf00Rf0sMCHDaqqU0meTHJ/kruSPFRVd+049u0k/2yM8cEkn05y/ninhOuTvqCPvqCPvqCPvqCPvqCPBT5s1j1JLo8xXh1jvJ3k6SRnlw+MMb4yxvjrxcXnk9xyzDPC9Upf0Edf0Edf0Edf0Edf0MQCHzbr5iSvLV2+srhuld9I8ketE8HJoS/ooy/ooy/ooy/ooy9ocnrTA8C7XO1y3dj1YNUvZ/sfuF9acfsjSR5Jkttuu+2o5oPrmb6gj76gj76gj76gj76giVfgw2ZdSXLr0uVbkry+81BVfTDJF5KcHWP81W53NMY4P8bYGmNsnTlzpmVYuM7oC/roC/roC/roC/roC5pY4MNmvZDkjqq6vapuSPJgkmeWD1TVbUm+lORfjTG+tYEZ4XqlL+ijL+ijL+ijL+ijL2jiLXRgg8YYV6vqsSTPJTmV5KkxxqWqenRx+7kkv53kZ5J8rqqS5OoYY2tTM8P1Ql/QR1/QR1/QR1/QR1/Qp8bY9e2ogOvY1tbWuHjx4qbHgEOrqhdn+w86fXFS6Av66Av66Av66Av6HKYvb6EDAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3zYsKq6r6peqarLVfX4LrdXVX1mcftLVfWhTcwJ1yN9QR99QR99QR99QR99QQ8LfNigqjqV5Mkk9ye5K8lDVXXXjmP3J7lj8fVIks8f65BwndIX9NEX9NEX9NEX9NEX9LHAh826J8nlMcarY4y3kzyd5OyOM2eTfHFsez7JjVX1vuMeFK5D+oI++oI++oI++oI++oImFviwWTcneW3p8pXFddd6BngnfUEffUEffUEffUEffUGT05seAN7lapfrxgHOpKoeyfb/gpYk/7uqXj7kbEfppiRvbXqIJeZZbaZZkuTnD/Fn9bUZ5lltplkSfa1jtr8z86w20yyJvtYx29+ZeVabaZZEX+uY7e/MPKvNNEuir3XM9ndmntVmmiU5RF8W+LBZV5LcunT5liSvH+BMxhjnk5xPkqq6OMbYOtpRD848e5tpnplmSbbnOcQf19cGmGe1mWZJ9LUO8+xtpnlmmiXR1zrMs7eZ5plplkRf6zDP3maaZ6ZZEn2twzx7m2memWZJDteXt9CBzXohyR1VdXtV3ZDkwSTP7DjzTJJPLD6t/SNJ/maM8ZfHPShch/QFffQFffQFffQFffQFTbwCHzZojHG1qh5L8lySU0meGmNcqqpHF7efS/JskgeSXE7y/SQPb2peuJ7oC/roC/roC/roC/roC/pY4MOGjTGezfY/YsvXnVv6fiT55DXe7fkjGO0omWdvM80z0yzJIefR10aYZ7WZZkn0tQ7z7G2meWaaJdHXOsyzt5nmmWmWRF/rMM/eZppnplkSfa3DPHubaZ6ZZkkOMU9ttwMAAAAAAMzEe+ADAAAAAMCELPDhOlZV91XVK1V1uaoe3+X2qqrPLG5/qao+tOF5fn0xx0tV9ZWquntTsyyd+4Wq+kFVfaxrlnXnqap7q+qrVXWpqv50k/NU1U9X1R9W1dcW87S9N2FVPVVVb1TVyytuP9af46XH1dcBZ1k6py99rZpLXwecZemcvvS1ai59HXCWpXP60tequfR1wFmWzulLX6vm0tcBZ1k6p6+T2tcYw5cvX9fhV7Y/FOZ/JPl7SW5I8rUkd+0480CSP0pSST6S5L9veJ5fTPLexff3d82zzixL5/5rtt+j72Mbfm5uTPKNJLctLv/shuf5N0l+d/H9mSTfTXJD0zz/NMmHkry84vZj+zm+xudIX/o66Dz60teBZ1k6py99HfQ50pe+DjqPvvR14FmWzulLXwd9jvSlr4POc9335RX4cP26J8nlMcarY4y3kzyd5OyOM2eTfHFsez7JjVX1vk3NM8b4yhjjrxcXn09yy6ZmWfjNJL+f5I2mOa5lno8n+dIY4ztJMsbonGmdeUaSn6qqSvKT2f4H7mrHMGOMLy/uf5Xj/Dn+EX0dYpYFfelrFX0dYpYFfelrFX0dYpYFfelrFX0dYpYFfelrFX0dYpYFfZ3gvizw4fp1c5LXli5fWVx3rWeOc55lv5Ht3zpuZJaqujnJryU51zTDNc2T5P1J3ltVf1JVL1bVJzY8z2eTfCDJ60m+nuS3xhg/bJxpL8f5c3wtj6mvFbPoS19H8Jj6WjGLvvR1BI+prxWz6EtfR/CY+loxi770dQSPqa8Vs+jr5Pd1um0coFvtct04wJmjsvZjVdUvZ/sfuF/a4CxPJPnUGOMH27+EbbXOPKeTfDjJryT5W0n+rKqeH2N8a0PzfDTJV5P88yR/P8l/rqr/Nsb4Xw3z7Oc4f46v5TH1tXqWJ6KvvebR1/6Pqa/VszwRfe01j772f0x9rZ7liehrr3n0tf9j6mv1LE9EX3vNo6/9H1Nfq2d5Ivraa57rvi8LfLh+XUly69LlW7L928RrPXOc86SqPpjkC0nuH2P81QZn2Ury9OIft5uSPFBVV8cYf7Chea4keWuM8b0k36uqLye5O0nHP3DrzPNwkn8/xhhJLlfVt5PcmeTPG+bZz3H+HF/LY+pr9Sz62nsefenrMLPoa+959KWvw8yir73n0Ze+DjOLvvaeR1/6Osws+tp7nuu/r9H0IQK+fPnq/cr2L+BeTXJ7/t8HdfyDHWd+Nf//h2P8+YbnuS3J5SS/uOnnZsf5C+n9kJd1npsPJPkvi7M/keTlJP9wg/N8Psm/W3z/c0n+IslNjc/R383qD3k5tp/ja3yO9KWvg86jL30deJYd5/Wlr4M8R/rS10Hn0Ze+DjzLjvP60tdBniN96eug81z3fXkFPlynxhhXq+qxJM9l+1O3nxpjXKqqRxe3n8v2p48/kO1/VL6f7d86bnKe307yM0k+t/jN8NUxxtaGZjk268wzxvhmVf1xkpeS/DDJF8YYL29qniSfTnKhqr6e7X9YPjXGeKtjnqr6vST3Jrmpqq4k+Z0kP740y7H9HP+Ivg49y7HR1970dWTz6Etf76CvI5tHX/p6B30d2Tz60tc76OvI5tGXvt6hq68ao/ttrAAAAAAAgGv1Y5seAAAAAAAAeCcLfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhPZd4FfVU1X1RlW9vOL2qqrPVNXlqnqpqj509GPCyaQv6KMv6KMv6KMv6KMv6KMv6LPOK/AvJLlvj9vvT3LH4uuRJJ8//FjwrnEh+oIuF6Iv6HIh+oIuF6Iv6HIh+oIuF6IvaLHvAn+M8eUk393jyNkkXxzbnk9yY1W976gGhJNMX9BHX9BHX9BHX9BHX9BHX9DnKN4D/+Ykry1dvrK4Djg8fUEffUEffUEffUEffUEffcEBnT6C+6hdrhu7Hqx6JNv/m0ze8573fPjOO+88goeHzXrxxRffGmOcabp7ffGupi/ooy/ooy/ooy/ooy/oc5i+jmKBfyXJrUuXb0ny+m4Hxxjnk5xPkq2trXHx4sUjeHjYrKr6n413ry/e1fQFffQFffQFffQFffQFfQ7T11G8hc4zST6x+DTpjyT5mzHGXx7B/QL6gk76gj76gj76gj76gj76ggPa9xX4VfV7Se5NclNVXUnyO0l+PEnGGOeSPJvkgSSXk3w/ycNdw8JJoy/ooy/ooy/ooy/ooy/ooy/os+8Cf4zx0D63jySfPLKJ4F1EX9BHX9BHX9BHX9BHX9BHX9DnKN5CBwAAAAAAOGIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJrTWAr+q7quqV6rqclU9vsvtP11Vf1hVX6uqS1X18NGPCieTvqCPvqCPvqCPvqCPvqCPvqDHvgv8qjqV5Mkk9ye5K8lDVXXXjmOfTPKNMcbdSe5N8h+q6oYjnhVOHH1BH31BH31BH31BH31BH31Bn3VegX9PkstjjFfHGG8neTrJ2R1nRpKfqqpK8pNJvpvk6pFOCieTvqCPvqCPvqCPvqCPvqCPvqDJOgv8m5O8tnT5yuK6ZZ9N8oEkryf5epLfGmP88EgmhJNNX9BHX9BHX9BHX9BHX9BHX9BknQV+7XLd2HH5o0m+muTvJPlHST5bVX/7HXdU9UhVXayqi2+++eY1jgonkr6gj76gj76gj76gj76gj76gyToL/CtJbl26fEu2f1O27OEkXxrbLif5dpI7d97RGOP8GGNrjLF15syZg84MJ4m+oI++oI++oI++oI++oI++oMk6C/wXktxRVbcvPljiwSTP7DjznSS/kiRV9XNJfj7Jq0c5KJxQ+oI++oI++oI++oI++oI++oImp/c7MMa4WlWPJXkuyakkT40xLlXVo4vbzyX5dJILVfX1bP8vM58aY7zVODecCPqCPvqCPvqCPvqCPvqCPvqCPvsu8JNkjPFskmd3XHdu6fvXk/zLox0N3h30BX30BX30BX30BX30BX30BT3WeQsdAAAAAADgmFngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACY0FoL/Kq6r6peqarLVfX4ijP3VtVXq+pSVf3p0Y4JJ5e+oI++oI++oI++oI++oI++oMfp/Q5U1akkTyb5F0muJHmhqp4ZY3xj6cyNST6X5L4xxneq6meb5oUTRV/QR1/QR1/QR1/QR1/QR1/QZ51X4N+T5PIY49UxxttJnk5ydseZjyf50hjjO0kyxnjjaMeEE0tf0Edf0Edf0Edf0Edf0Edf0GSdBf7NSV5bunxlcd2y9yd5b1X9SVW9WFWf2O2OquqRqrpYVRfffPPNg00MJ4u+oI++oI++oI++oI++oI++oMk6C/za5bqx4/LpJB9O8qtJPprk31bV+9/xh8Y4P8bYGmNsnTlz5pqHhRNIX9BHX9BHX9BHX9BHX9BHX9Bk3/fAz/ZvzG5dunxLktd3OfPWGON7Sb5XVV9OcneSbx3JlHBy6Qv66Av66Av66Av66Av66AuarPMK/BeS3FFVt1fVDUkeTPLMjjP/Mck/qarTVfUTSf5xkm8e7ahwIukL+ugL+ugL+ugL+ugL+ugLmuz7CvwxxtWqeizJc0lOJXlqjHGpqh5d3H5ujPHNqvrjJC8l+WGSL4wxXu4cHE4CfUEffUEffUEffUEffUEffUGfGmPn21Edj62trXHx4sWNPDYcpap6cYyxtek5lumLk0Jf0Edf0Edf0Edf0Edf0Ocwfa3zFjoAAAAAAMAxs8AHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADChtRb4VXVfVb1SVZer6vE9zv1CVf2gqj52dCPCyaYv6KMv6KMv6KMv6KMv6KMv6LHvAr+qTiV5Msn9Se5K8lBV3bXi3O8mee6oh4STSl/QR1/QR1/QR1/QR1/QR1/QZ51X4N+T5PIY49UxxttJnk5ydpdzv5nk95O8cYTzwUmnL+ijL+ijL+ijL+ijL+ijL2iyzgL/5iSvLV2+srju/6qqm5P8WpJze91RVT1SVRer6uKbb755rbPCSaQv6KMv6KMv6KMv6KMv6KMvaLLOAr92uW7suPxEkk+NMX6w1x2NMc6PMbbGGFtnzpxZc0Q40fQFffQFffQFffQFffQFffQFTU6vceZKkluXLt+S5PUdZ7aSPF1VSXJTkgeq6uoY4w+OYkg4wfQFffQFffQFffQFffQFffQFTdZZ4L+Q5I6quj3JXyR5MMnHlw+MMW7/0fdVdSHJfxIfrEVf0Edf0Edf0Edf0Edf0Edf0GTfBf4Y42pVPZbtT4c+leSpMcalqnp0cfue71sFrKYv6KMv6KMv6KMv6KMv6KMv6LPOK/Azxng2ybM7rts1vDHGvz78WPDuoS/ooy/ooy/ooy/ooy/ooy/osc6H2AIAAAAAAMfMAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAmttcCvqvuq6pWqulxVj+9y+69X1UuLr69U1d1HPyqcTPqCPvqCPvqCPvqCPvqCPvqCHvsu8KvqVJInk9yf5K4kD1XVXTuOfTvJPxtjfDDJp5OcP+pB4STSF/TRF/TRF/TRF/TRF/TRF/RZ5xX49yS5PMZ4dYzxdpKnk5xdPjDG+MoY468XF59PcsvRjgknlr6gj76gj76gj76gj76gj76gyToL/JuTvLZ0+criulV+I8kfHWYoeBfRF/TRF/TRF/TRF/TRF/TRFzQ5vcaZ2uW6sevBql/OdoC/tOL2R5I8kiS33XbbmiPCiaYv6KMv6KMv6KMv6KMv6KMvaLLOK/CvJLl16fItSV7feaiqPpjkC0nOjjH+arc7GmOcH2NsjTG2zpw5c5B54aTRF/TRF/TRF/TRF/TRF/TRFzRZZ4H/QpI7qur2qrohyYNJnlk+UFW3JflSkn81xvjW0Y8JJ5a+oI++oI++oI++oI++oI++oMm+b6EzxrhaVY8leS7JqSRPjTEuVdWji9vPJfntJD+T5HNVlSRXxxhbfWPDyaAv6KMv6KMv6KMv6KMv6KMv6FNj7Pp2VO22trbGxYsXN/LYcJSq6sXZ/sHRFyeFvqCPvqCPvqCPvqCPvqDPYfpa5y10AAAAAACAY2aBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQmst8Kvqvqp6paouV9Xju9xeVfWZxe0vVdWHjn5UOJn0BX30BX30BX30BX30BX30BT32XeBX1akkTya5P8ldSR6qqrt2HLs/yR2Lr0eSfP6I54QTSV/QR1/QR1/QR1/QR1/QR1/QZ51X4N+T5PIY49UxxttJnk5ydseZs0m+OLY9n+TGqnrfEc8KJ5G+oI++oI++oI++oI++oI++oMk6C/ybk7y2dPnK4rprPQO8k76gj76gj76gj76gj76gj76gyek1ztQu140DnElVPZLt/0UmSf53Vb28xuMfl5uSvLXpIZaYZ7WZZkmSnz/En9XXZphntZlmSfS1jtn+zsyz2kyzJPpax2x/Z+ZZbaZZEn2tY7a/M/OsNtMsib7WMdvfmXlWm2mWRF/rmO3vzDyrzTRLcoi+1lngX0ly69LlW5K8foAzGWOcT3I+Sarq4hhj65qmbWSevc00z0yzJNvzHOKP62sDzLPaTLMk+lqHefY20zwzzZLoax3m2dtM88w0S6KvdZhnbzPNM9Msib7WYZ69zTTPTLMk+lqHefY20zwzzZIcrq913kLnhSR3VNXtVXVDkgeTPLPjzDNJPrH4NOmPJPmbMcZfHnQoeBfRF/TRF/TRF/TRF/TRF/TRFzTZ9xX4Y4yrVfVYkueSnEry1BjjUlU9urj9XJJnkzyQ5HKS7yd5uG9kODn0BX30BX30BX30BX30BX30BX3WeQudjDGezXZky9edW/p+JPnkNT72+Ws83808e5tpnplmSQ45j742wjyrzTRLoq91mGdvM80z0yyJvtZhnr3NNM9MsyT6Wod59jbTPDPNkuhrHebZ20zzzDRLoq91mGdvM80z0yzJIeap7XYAAAAAAICZrPMe+AAAAAAAwDFrX+BX1X1V9UpVXa6qx3e5varqM4vbX6qqD214nl9fzPFSVX2lqu7e1CxL536hqn5QVR/rmmXdearq3qr6alVdqqo/3eQ8VfXTVfWHVfW1xTxt751WVU9V1RtV9fKK24/153jpcfV1wFmWzulLX6vm0tcBZ1k6py99rZpLXwecZemcvvS1ai59HXCWpXP60tequfR1wFmWzulLX6vm0tcBZ1k6p6+T2tcYo+0r2x9a8T+S/L0kNyT5WpK7dpx5IMkfJakkH0ny3zc8zy8mee/i+/u75llnlqVz/zXb7yH2sQ0/Nzcm+UaS2xaXf3bD8/ybJL+7+P5Mku8muaFpnn+a5ENJXl5x+7H9HF/jc6QvfR10Hn3p68CzLJ3Tl74O+hzpS18HnUdf+jrwLEvn9KWvgz5H+tLXQefRl74OPMvSOX2d0L66X4F/T5LLY4xXxxhvJ3k6ydkdZ84m+eLY9nySG6vqfZuaZ4zxlTHGXy8uPp/klk3NsvCbSX4/yRtNc1zLPB9P8qUxxneSZIzROdM684wkP1VVleQnsx3g1Y5hxhhfXtz/Ksf5c/wj+jrELAv60tcq+jrELAv60tcq+jrELAv60tcq+jrELAv60tcq+jrELAv60tcq+jrELAv6OsF9dS/wb07y2tLlK4vrrvXMcc6z7Dey/VuRjcxSVTcn+bUk59Jvnefm/UneW1V/UlUvVtUnNjzPZ5N8IMnrSb6e5LfGGD9snGkvx/lzfC2Pqa8Vs+hLX0fwmPpaMYu+9HUEj6mvFbPoS19H8Jj6WjGLvvR1BI+prxWz6EtfR/CY+loxi75Ofl+n28bZVrtcNw5w5qis/VhV9cvZDvCXNjjLE0k+Ncb4wfYviVqtM8/pJB9O8itJ/laSP6uq58cY39rQPB9N8tUk/zzJ30/yn6vqv40x/lfDPPs5zp/ja3lMfa2e5Ynoa6959LX/Y+pr9SxPRF97zaOv/R9TX6tneSL62msefe3/mPpaPcsT0dde8+hr/8fU1+pZnoi+9ppHX/s/pr5Wz/JE9LXXPNd9X90L/CtJbl26fEu2f9txrWeOc55U1QeTfCHJ/WOMv9rgLFtJnl7Ed1OSB6rq6hjjDzY0z5Ukb40xvpfke1X15SR3J+kIcJ15Hk7y78cYI8nlqvp2kjuT/HnDPPs5zp/ja3lMfa2eRV97z6MvfR1mFn3tPY++9HWYWfS19zz60tdhZtHX3vPoS1+HmUVfe8+jL30dZhZ97T3P9d/XaPoQge3nJKeTvJrk9vy/DxL4BzvO/Gr+/zfv//MNz3NbkstJfnHTz82O8xfS+yEU6zw3H0jyXxZnfyLJy0n+4Qbn+XySf7f4/ueS/EWSmxqfo7+b1R9CcWw/x9f4HOlLXwedR1/6OvAsO87rS18HeY70pa+DzqMvfR14lh3n9aWvgzxH+tLXQefRl74OPMuO8/o6gX21vgJ/jHG1qh5L8ly2PxX4qTHGpap6dHH7uWx/OvID2f6h/362fyuyyXl+O8nPJPnc4jdXV8cYWxua5disM88Y45tV9cdJXkrywyRfGGO8vKl5knw6yYWq+nq2f/A/NcZ4q2Oeqvq9JPcmuamqriT5nSQ/vjTLsf0c/4i+Dj3LsdHX3vR1ZPPoS1/voK8jm0df+noHfR3ZPPrS1zvo68jm0Ze+3kFfRzaPvvT1Dl191Rjdb2MFAAAAAABcqx/b9AAAAAAAAMA7WeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACa07wK/qp6qqjeq6uUVt1dVfaaqLlfVS1X1oaMfE04mfUEffUEffUEffUEffUEffUGfdV6BfyHJfXvcfn+SOxZfjyT5/OHHgneNC9EXdLkQfUGXC9EXdLkQfUGXC9EXdLkQfUGLfRf4Y4wvJ/nuHkfOJvni2PZ8khur6n1HNSCcZPqCPvqCPvqCPvqCPvqCPvqCPkfxHvg3J3lt6fKVxXXA4ekL+ugL+ugL+ugL+ugL+ugLDuj0EdxH7XLd2PVg1SPZ/t9k8p73vOfDd9555xE8PGzWiy+++NYY40zT3euLdzV9QR99QR99QR99QR99QZ/D9HUUC/wrSW5dunxLktd3OzjGOJ/kfJJsbW2NixcvHsHDw2ZV1f9svHt98a6mL+ijL+ijL+ijL+ijL+hzmL6O4i10nknyicWnSX8kyd+MMf7yCO4X0Bd00hf00Rf00Rf00Rf00Rcc0L6vwK+q30tyb5KbqupKkt9J8uNJMsY4l+TZJA8kuZzk+0ke7hoWThp9QR99QR99QR99QR99QR99QZ99F/hjjIf2uX0k+eSRTQTvIvqCPvqCPvqCPvqCPvqCPvqCPkfxFjoAAAAAAMARs8AHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADChtRb4VXVfVb1SVZer6vFdbv/pqvrDqvpaVV2qqoePflQ4mfQFffQFffQFffQFffQFffQFPfZd4FfVqSRPJrk/yV1JHqqqu3Yc+2SSb4wx7k5yb5L/UFU3HPGscOLoC/roC/roC/roC/roC/roC/qs8wr8e5JcHmO8OsZ4O8nTSc7uODOS/FRVVZKfTPLdJFePdFI4mfQFffQFffQFffQFffQFffQFTdZZ4N+c5LWly1cW1y37bJIPJHk9ydeT/NYY44dHMiGcbPqCPvqCPvqCPvqCPvqCPvqCJuss8GuX68aOyx9N8tUkfyfJP0ry2ar62++4o6pHqupiVV188803r3FUOJH0BX30BX30BX30BX30BX30BU3WWeBfSXLr0uVbsv2bsmUPJ/nS2HY5ybeT3LnzjsYY58cYW2OMrTNnzhx0ZjhJ9AV99AV99AV99AV99AV99AVN1lngv5Dkjqq6ffHBEg8meWbHme8k+ZUkqaqfS/LzSV49ykHhhNIX9NEX9NEX9NEX9NEX9NEXNDm934ExxtWqeizJc0lOJXlqjHGpqh5d3H4uyaeTXKiqr2f7f5n51Bjjrca54UTQF/TRF/TRF/TRF/TRF/TRF/TZd4GfJGOMZ5M8u+O6c0vfv57kXx7taPDuoC/ooy/ooy/ooy/ooy/ooy/osc5b6AAAAAAAAMfMAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwITWWuBX1X1V9UpVXa6qx1ecubeqvlpVl6rqT492TDi59AV99AV99AV99AV99AV99AU9Tu93oKpOJXkyyb9IciXJC1X1zBjjG0tnbkzyuST3jTG+U1U/2zQvnCj6gj76gj76gj76gj76gj76gj7rvAL/niSXxxivjjHeTvJ0krM7znw8yZfGGN9JkjHGG0c7JpxY+oI++oI++oI++oI++oI++oIm6yzwb07y2tLlK4vrlr0/yXur6k+q6sWq+sRud1RVj1TVxaq6+Oabbx5sYjhZ9AV99AV99AV99AV99AV99AVN1lng1y7XjR2XTyf5cJJfTfLRJP+2qt7/jj80xvkxxtYYY+vMmTPXPCycQPqCPvqCPvqCPvqCPvqCPvqCJvu+B362f2N269LlW5K8vsuZt8YY30vyvar6cpK7k3zrSKaEk0tf0Edf0Edf0Edf0Edf0Edf0GSdV+C/kOSOqrq9qm5I8mCSZ3ac+Y9J/klVna6qn0jyj5N882hHhRNJX9BHX9BHX9BHX9BHX9BHX9Bk31fgjzGuVtVjSZ5LcirJU2OMS1X16OL2c2OMb1bVHyd5KckPk3xhjPFy5+BwEugL+ugL+ugL+ugL+ugL+ugL+tQYO9+O6nhsbW2NixcvbuSx4ShV1YtjjK1Nz7FMX5wU+oI++oI++oI++oI++oI+h+lrnbfQAQAAAAAAjpkFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACa21wK+q+6rqlaq6XFWP73HuF6rqB1X1saMbEU42fUEffUEffUEffUEffUEffUGPfRf4VXUqyZNJ7k9yV5KHququFed+N8lzRz0knFT6gj76gj76gj76gj76gj76gj7rvAL/niSXxxivjjHeTvJ0krO7nPvNJL+f5I0jnA9OOn1BH31BH31BH31BH31BH31Bk3UW+DcneW3p8pXFdf9XVd2c5NeSnNvrjqrqkaq6WFUX33zzzWudFU4ifUEffUEffUEffUEffUEffUGTdRb4tct1Y8flJ5J8aozxg73uaIxxfoyxNcbYOnPmzJojwommL+ijL+ijL+ijL+ijL+ijL2hyeo0zV5LcunT5liSv7zizleTpqkqSm5I8UFVXxxh/cBRDwgmmL+ijL+ijL+ijL+ijL+ijL2iyzgL/hSR3VNXtSf4iyYNJPr58YIxx+4++r6oLSf6T+GAt+oI++oI++oI++oI++oI++oIm+y7wxxhXq+qxbH869KkkT40xLlXVo4vb93zfKmA1fUEffUEffUEffUEffUEffUGfdV6BnzHGs0me3XHdruGNMf714ceCdw99QR99QR99QR99QR99QR99QY91PsQWAAAAAAA4Zhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMaK0FflXdV1WvVNXlqnp8l9t/vapeWnx9paruPvpR4WTSF/TRF/TRF/TRF/TRF/TRF/TYd4FfVaeSPJnk/iR3JXmoqu7acezbSf7ZGOODST6d5PxRDwonkb6gj76gj76gj76gj76gj76gzzqvwL8nyeUxxqtjjLeTPJ3k7PKBMcZXxhh/vbj4fJJbjnZMOLH0BX30BX30BX30BX30BX30BU3WWeDfnOS1pctXFtet8htJ/ugwQ8G7iL6gj76gj76gj76gj76gj76gyek1ztQu141dD1b9crYD/KUVtz+S5JEkue2229YcEU40fUEffUEffUEffUEffUEffUGTdV6BfyXJrUuXb0ny+s5DVfXBJF9IcnaM8Ve73dEY4/wYY2uMsXXmzJmDzAsnjb6gj76gj76gj76gj76gj76gyToL/BeS3FFVt1fVDUkeTPLM8oGqui3Jl5L8qzHGt45+TDix9AV99AV99AV99AV99AV99AVN9n0LnTHG1ap6LMlzSU4leWqMcamqHl3cfi7Jbyf5mSSfq6okuTrG2OobG04GfUEffUEffUEffUEffUEffUGfGmPXt6Nqt7W1NS5evLiRx4ajVFUvzvYPjr44KfQFffQFffQFffQFffQFfQ7T1zpvoQMAAAAAABwzC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABOywAcAAAAAgAlZ4AMAAAAAwIQs8AEAAAAAYEIW+AAAAAAAMCELfAAAAAAAmJAFPgAAAAAATMgCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACYkAU+AAAAAABMyAIfAAAAAAAmZIEPAAAAAAATssAHAAAAAIAJWeADAAAAAMCELPABAAAAAGBCFvgAAAAAADAhC3wAAAAAAJiQBT4AAAAAAEzIAh8AAAAAACZkgQ8AAAAAABNaa4FfVfdV1StVdbmqHt/l9qqqzyxuf6mqPnT0o8LJpC/ooy/ooy/ooy/ooy/ooy/ose8Cv6pOJXkyyf1J7kryUFXdtePY/UnuWHw9kuTzRzwnnEj6gj76gj76gj76gj76gj76gj7rvAL/niSXxxivjjHeTvJ0krM7zpxN8sWx7fkkN1bV+454VjiJ9AV99AV99AV99AV99AV99AVN1lng35zktaXLVxbXXesZ4J30BX30BX30BX30BX30BX30BU1Or3GmdrluHOBMquqRbP8vMknyv6vq5TUe/7jclOStTQ+xxDyrzTRLkvz8If6svjbDPKvNNEuir3XM9ndmntVmmiXR1zpm+zszz2ozzZLoax2z/Z2ZZ7WZZkn0tY7Z/s7Ms9pMsyT6Wsdsf2fmWW2mWZJD9LXOAv9KkluXLt+S5PUDnMkY43yS80lSVRfHGFvXNG0j8+xtpnlmmiXZnucQf1xfG2Ce1WaaJdHXOsyzt5nmmWmWRF/rMM/eZppnplkSfa3DPHubaZ6ZZkn0tQ7z7G2meWaaJdHXOsyzt5nmmWmW5HB9rfMWOi8kuaOqbq+qG5I8mOSZHWeeSfKJxadJfyTJ34wx/vKgQ8G7iL6gj76gj76gj76gj76gj76gyb6vwB9jXK2qx5I8l+RUkqfGGJeq6tHF7eeSPJvkgSSXk3w/ycN9I8PJoS/ooy/ooy/ooy/ooy/ooy/os85b6GSM8Wy2I1u+7tzS9yPJJ6/xsc9f4/lu5tnbTPPMNEtyyHn0tRHmWW2mWRJ9rcM8e5tpnplmSfS1DvPsbaZ5Zpol0dc6zLO3meaZaZZEX+swz95mmmemWRJ9rcM8e5tpnplmSQ4xT223AwAAAAAAzGSd98AHAAAAAACOWfsCv6ruq6pXqupyVT2+y+1VVZ9Z3P5SVX1ow/P8+mKOl6rqK1V196ZmWTr3C1X1g6r6WNcs685TVfdW1Ver6lJV/ekm56mqn66qP6yqry3maXvvtKp6qqreqKqXV9x+rD/HS4+rrwPOsnROX/paNZe+DjjL0jl96WvVXPo64CxL5/Slr1Vz6euAsyyd05e+Vs2lrwPOsnROX/paNZe+DjjL0jl9ndS+xhhtX9n+0Ir/keTvJbkhydeS3LXjzANJ/ihJJflIkv++4Xl+Mcl7F9/f3zXPOrMsnfuv2X4PsY9t+Lm5Mck3kty2uPyzG57n3yT53cX3Z5J8N8kNTfP80yQfSvLyituP7ef4Gp8jfenroPPoS18HnmXpnL70ddDnSF/6Oug8+tLXgWdZOqcvfR30OdKXvg46j770deBZls7p64T21f0K/HuSXB5jvDrGeDvJ00nO7jhzNskXx7bnk9xYVe/b1DxjjK+MMf56cfH5JLdsapaF30zy+0neaJrjWub5eJIvjTG+kyRjjM6Z1plnJPmpqqokP5ntAK92DDPG+PLi/lc5zp/jH9HXIWZZ0Je+VtHXIWZZ0Je+VtHXIWZZ0Je+VtHXIWZZ0Je+VtHXIWZZ0Je+VtHXIWZZ0NcJ7qt7gX9zkteWLl9ZXHetZ45znmW/ke3fimxklqq6OcmvJTmXfus8N+9P8t6q+pOqerGqPrHheT6b5ANJXk/y9SS/Ncb4YeNMeznOn+NreUx9rZhFX/o6gsfU14pZ9KWvI3hMfa2YRV/6OoLH1NeKWfSlryN4TH2tmEVf+jqCx9TXiln0dfL7Ot02zrba5bpxgDNHZe3HqqpfznaAv7TBWZ5I8qkxxg+2f0nUap15Tif5cJJfSfK3kvxZVT0/xvjWhub5aJKvJvnnSf5+kv9cVf9tjPG/GubZz3H+HF/LY+pr9SxPRF97zaOv/R9TX6tneSL62msefe3/mPpaPcsT0dde8+hr/8fU1+pZnoi+9ppHX/s/pr5Wz/JE9LXXPPra/zH1tXqWJ6Kvvea57vvqXuBfSXLr0uVbsv3bjms9c5zzpKo+mOQLSe4fY/zVBmfZSvL0Ir6bkjxQVVfHGH+woXmuJHlrjPG9JN+rqi8nuTtJR4DrzPNwkn8/xhhJLlfVt5PcmeTPG+bZz3H+HF/LY+pr9Sz62nsefenrMLPoa+959KWvw8yir73n0Ze+DjOLvvaeR1/6Osws+tp7Hn3p6zCz6Gvvea7/vkbThwhsPyc5neTVJLfn/32QwD/YceZX8/+/ef+fb3ie25JcTvKLm35udpy/kN4PoVjnuflAkv+yOPsTSV5O8g83OM/nk/y7xfc/l+QvktzU+Bz93az+EIpj+zm+xudIX/o66Dz60teBZ9lxXl/6OshzpC99HXQefenrwLPsOK8vfR3kOdKXvg46j770deBZdpzX1wnsq/UV+GOMq1X1WJLnsv2pwE+NMS5V1aOL289l+9ORH8j2D/33s/1bkU3O89tJfibJ5xa/ubo6xtja0CzHZp15xhjfrKo/TvJSkh8m+cIY4+VNzZPk00kuVNXXs/2D/6kxxlsd81TV7yW5N8lNVXUlye8k+fGlWY7t5/hH9HXoWY6NvvamryObR1/6egd9Hdk8+tLXO+jryObRl77eQV9HNo++9PUO+jqyefSlr3fo6qvG6H4bKwAAAAAA4Fr92KYHAAAAAAAA3skCHwAAAAAAJmSBDwAAAAAAE7LABwAAAACACVngAwAAAADAhCzwAQAAAABgQhb4AAAAAAAwIQt8AAAAAACY0P8BjSDK80Sj+eIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1512x648 with 21 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from PIL import Image\n",
    "import torchvision\n",
    "import copy\n",
    "\n",
    "def vis_grid():\n",
    "    #rng = np.random.default_rng(42)\n",
    "    rng = np.random.default_rng(45)\n",
    "\n",
    "    figsize = 3\n",
    "    # num_row=10\n",
    "    # num_col=7\n",
    "    num_row=3\n",
    "    num_col=7\n",
    "\n",
    "    perm = rng.permutation(len(scenes))\n",
    "    fig, axes = plt.subplots(num_row, num_col,\n",
    "                            squeeze=False, constrained_layout=True)\n",
    "    fig.set_size_inches(figsize*num_col, figsize*num_row)\n",
    "\n",
    "    for r in range(num_row):\n",
    "        for c in range(num_col):\n",
    "            ax = axes[r, c]\n",
    "            ax.axis('off')\n",
    "            # ax.set_xticklabels([])\n",
    "            # ax.set_yticklabels([])\n",
    "            ax.set_aspect('equal')\n",
    "            j = perm[r * num_col + c]\n",
    "            img = scenes[j]['gt']['img'][:] / 255\n",
    "            img = np.transpose(img, (1, 2, 0))\n",
    "            gt_boxes = scenes[j]['gt']['boxes'][:]\n",
    "            boxes = scenes[j][f'itr_{eval_itr}']['boxes'][:]\n",
    "            draw_img(ax, img, boxes=boxes)#, gt_boxes=gt_boxes)\n",
    "\n",
    "vis_grid()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed63b419-a179-4775-8dd3-7f287c431158",
   "metadata": {},
   "outputs": [],
   "source": [
    "def vis_gradual():\n",
    "    # Good img ids: 1538, 1012, 2519, 964, 1401, 500, 1921, 3760, 1752, 553, 2861, 2255, 3701\n",
    "    \n",
    "    rng = np.random.default_rng(26)\n",
    "    \n",
    "    figsize = 3\n",
    "    num_row=20\n",
    "    num_col=5\n",
    "    \n",
    "    itrs = [0, 1, 2, 3, 4]\n",
    "\n",
    "    perm = rng.permutation(len(scenes))\n",
    "    perm = [500, 3701]\n",
    "    num_row = len(perm)\n",
    "    \n",
    "    fig, axes = plt.subplots(num_row, num_col,\n",
    "                            squeeze=False, constrained_layout=True)\n",
    "    fig.set_size_inches(figsize*num_col, figsize*num_row)\n",
    "    print(perm[:num_row])\n",
    "    for r in range(num_row):\n",
    "        for c in range(num_col):\n",
    "            ax = axes[r, c]\n",
    "            ax.axis('off')\n",
    "            # ax.set_xticklabels([])\n",
    "            # ax.set_yticklabels([])\n",
    "            ax.set_aspect('equal')\n",
    "            j = perm[r]\n",
    "            img = scenes[j]['gt']['img'][:] / 255\n",
    "            img = np.transpose(img, (1, 2, 0))\n",
    "            boxes = scenes[j][f'itr_{itrs[c]}']['boxes'][:20]\n",
    "            draw_img(ax, img, boxes=boxes)#, gt_boxes=gt_boxes)\n",
    "            \n",
    "#vis_gradual()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "59c0866d-6ebe-48d6-b99e-c94992db2679",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0ebb4ee6-367d-476a-9378-fdc2b15594bc",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
